<?php

namespace app\index\controller;

use think\facade\Session;
use app\common\model\User;
use app\common\services\Password as PasswordService;
use app\index\BaseController;
use think\Request;
use think\Image;
use think\image\Exception as ImageException;

class Auth extends BaseController
{
    const SESSION_NAME = 'app_auth';

    protected static $currentUser = null;

    /**
     * 从SESSION获取当前登录的用户
     *
     * @return \app\common\model\User
     */
    public static function getUserFromSession()
    {
        if (static::$currentUser === null) {
            $id = Session::get(self::SESSION_NAME);
            static::$currentUser = User::where('id', $id)->find();
        }
        return static::$currentUser;
    }

    /**
     * 获取登录公钥
     *
     * @return \think\Response
     */
    public function getPublickey()
    {
        // 读取公钥
        $publickey = PasswordService::getPublickey();

        // 返回响应
        if (request()->type() === 'json') {
            return json([
                'key' => $publickey,
            ]);
        } else {
            return response($publickey)->contentType('text/plain');
        }
    }

    /**
     * 获取当前登录的用户
     *
     * @return \think\Response
     */
    public function getCurrentUser()
    {
        return json(getCurrentUser());
    }

    /**
     * 登录
     *
     * @return \think\Response
     * @args username 用户名
     * @args password+ 加密后的密码
     * @args enkey+ 加密后的key
     * @args iv+ 随机向量
     */
    public function login()
    {
        $username = input('username');
        $password = input('password');
        $enkey = input('enkey');
        $iv = input('iv');

        // 使用默认私钥解密出真实密码
        $password = PasswordService::decrypetPassword($enkey, $iv, $password);

        /** @var User $user */
        $user = User::where('username', $username)->find();
        $user->last_login_at = time();
        $user->save();
        if ($user && $user->checkPasswordValid($password)) {
            // 添加SESSION，进入登录状态
            Session::set(self::SESSION_NAME, $user->id);

            // 返回响应
            return json($user);
        }

        error('用户名或密码错误');
    }

    /**
     * 登出
     *
     * @return \think\Response
     */
    public function logout()
    {
        // 删除SESSION，登录状态自动解除
        Session::delete(self::SESSION_NAME);

        // 返回响应
        if (request()->type() === 'json') {
            return json([
                'message' => '登出成功',
            ]);
        } else {
            return response('登出成功');
        }
    }

    /**
     * 修改个人用户密码
     *
     * @param  int  $id
     * @return \think\Response
     * @args password+ 加密后的密码
     * @args enkey+ 加密后的key
     * @args iv+ 随机向量
     */
    public function changeMyPassword()
    {
        $password = input('password');
        $enkey = input('enkey');
        $iv = input('iv');

        // 获取当前登录的用户
        $user = getCurrentUser();

        // 使用默认私钥解密出真实密码
        $password = PasswordService::decrypetPassword($enkey, $iv, $password);

        // 修改密码
        $user->setPassword($password);
        $user->save();

        // 返回响应
        if (request()->type() === 'json') {
            return json([
                'message' => '密码修改成功',
            ]);
        } else {
            return response('密码修改成功');
        }
    }

    /**
     * 上传用户头像
     *
     * @return \think\Response
     * @formdata
     * @args image 图片，图片尺寸最大512x512
     */
    public function uploadAvatar(Request $request)
    {
        $imageFile = $request->file('image');

        if (!$imageFile) {
            error('未找到图片，上传的文件太大了？');
        }

        // 检查文件大小，不能超过1MB
        $size = $imageFile->getInfo('size');
        if ($size > 1 * 1024 * 1024) {
            error('图片大小不能超过1M哦');
        }

        $currentUser = getCurrentUser();

        // 删除已存在的头像
        $currentUser->removeAvatarIfExist();

        // 打开图片，获取类型、宽高
        try {
            $image = Image::open($imageFile);
        } catch (ImageException $e) {
            error('图片异常：' . $e->getMessage());
        } catch (\Exception $e) {
            error('异常：' . $e->getMessage());
        }
        $type = $image->type();
        $width = $image->width();
        $height = $image->height();

        // 检查类型
        if (!in_array($type, ['jpg', 'png', 'jpeg'])) {
            error('图片类型无效，必须是jpg或png图片');
        }

        // 检查宽高
        if (($width > 512 || $height > 512)) {
            error('图片尺寸太大，最大尺寸为宽x高=512x512(px)');
        }

        // 根据ID创建avatar属性
        $currentUser->avatar = $currentUser->buildAvatarName($type);

        // 保存图片
        $image->save($currentUser->avatar_path);
        $currentUser->save();

        return json($currentUser);
    }
}
